/**
 * 
 */
package org.youisoft.summer.evaluator.operator.base;
import org.youisoft.summer.evaluator.operator.AbstractPrimitiveOperator;
import org.youisoft.summer.evaluator.operator.Operator;

/**
 * @author zijiang.jl
 *
 */
public class NumberOperator extends AbstractPrimitiveOperator<java.lang.Number>{

	
	public NumberOperator(){
		
	}
	public NumberOperator(Number value){
		this.setValue(value);
	}
	
	public NumberOperator(float value){
		this.setValue(value);
	}
	
	public NumberOperator(double value){
		this.setValue(value);
	}
	
	public NumberOperator(int value){
		this.setValue(value);
	}
	
	public NumberOperator(short value){
		this.setValue(value);
	}
	
	public NumberOperator(long value){
		this.setValue(value);
	}
	
	public NumberOperator(byte value){
		this.setValue(value);
	}

	public NumberOperator(String value){
		this.setValue(Double.valueOf(value));
	}
	
	@Override
	public Operator<java.lang.Number> or(Operator<java.lang.Number> t) {
		this.setValue(this.value().byteValue()|t.value().byteValue());
		return super.or(t);
	}

	@Override
	public Operator<java.lang.Number> xor(Operator<java.lang.Number> t) {
		this.setValue(this.value().byteValue()^t.value().byteValue());
		return super.xor(t);
	}

	@Override
	public Operator<java.lang.Number> and(Operator<java.lang.Number> t) {
		this.setValue(this.value().byteValue()&t.value().byteValue());
		return super.and(t);
	}

	@Override
	public Operator<java.lang.Number> no() {
		this.setValue(~this.value().byteValue());
		return super.no();
	}


	@Override
	public Operator<java.lang.Number> eq(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()==t.value().doubleValue()) {
			this.setValue(1);
		}else{
			this.setValue(0);
		}
		return super.eq(t);
	}

	@Override
	public Operator<java.lang.Number> neq(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()==t.value().doubleValue()) {
			this.setValue(0);
		}else{
			this.setValue(1);
		}
		return super.neq(t);
	}

	@Override
	public Operator<java.lang.Number> grt(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()>t.value().doubleValue()) {
			this.setValue(1);
		}else{
			this.setValue(0);
		}
		return super.grt(t);
	}

	@Override
	public Operator<java.lang.Number> les(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()<t.value().doubleValue()) {
			this.setValue(1);
		}else{
			this.setValue(0);
		}
		return super.les(t);
	}

	@Override
	public Operator<java.lang.Number> gre(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()>=t.value().doubleValue()) {
			this.setValue(1);
		}else{
			this.setValue(0);
		}
		return super.gre(t);
	}

	@Override
	public Operator<java.lang.Number> lee(Operator<java.lang.Number> t) {
		if(this.value().doubleValue()<=t.value().doubleValue()) {
			this.setValue(1);
		}else{
			this.setValue(0);
		}
		return super.lee(t);
	}


	@Override
	public Operator<java.lang.Number> add(Operator<java.lang.Number> t) {
		this.setValue(this.value().doubleValue()+t.value().doubleValue());
		return super.add(t);
	}

	@Override
	public Operator<java.lang.Number> sub(Operator<java.lang.Number> t) {
		this.setValue(this.value().doubleValue()-t.value().doubleValue());
		return super.sub(t);
	}

	@Override
	public Operator<java.lang.Number> mul(Operator<java.lang.Number> t) {
		this.setValue(this.value().doubleValue()*t.value().doubleValue());
		return super.mul(t);
	}

	@Override
	public Operator<java.lang.Number> div(Operator<java.lang.Number> t) {
		if(t.value().doubleValue()==0){
			throw new RuntimeException("div number operator is zero");
		}
		this.setValue(this.value().doubleValue()/t.value().doubleValue());
		return super.div(t);
	}

	@Override
	public Operator<java.lang.Number> mod(Operator<java.lang.Number> t) {
		this.setValue(this.value().doubleValue()%t.value().doubleValue());
		return super.mod(t);
	}

	@Override
	public Operator<java.lang.Number> plus() {
		return super.plus();
	}

	@Override
	public Operator<java.lang.Number> minus() {
		this.setValue(-this.value().doubleValue());
		return super.minus();
	}	
	
	
	@Override
	public NumberOperator convertToNumberOperator() {
		return this;
	}
	
	@Override
	public StringOperator convertToStringOperator(){
		return new StringOperator(this.value().toString());
	}
}
